/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package negocio;

import excepciones.SalaException;
import excepciones.UsuarioException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import net.sf.ehcache.hibernate.HibernateUtil;
import org.hibernate.Session;
import persistencia.Persistencia;

/**
 *
 * @author diego
 */
public class Complejo {
    
    //Conoce a los Eventos
    private Integer id;
    private String nombre;
    private Set<Sala> salas;    
    private Set<Evento> eventos;
    private Map<String,Usuario> usuarios;
    private Set<TransaccionVentas> transaccionesVentas;
    
    public final static Persistencia persistencia = new Persistencia();

    public Complejo() {
    }

    public Complejo(String nombre) {   
        this.nombre = nombre;
        this.salas = new HashSet();
        this.eventos = new HashSet();
        this.usuarios = new HashMap();
        this.transaccionesVentas = new HashSet(); 
        
        Complejo.persistencia.insert(this);
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Set<Sala> getSalas() {
        return salas;
    }

    public void setSalas(Set<Sala> salas) {
        this.salas = salas;
    }

    public Set<Evento> getEventos() {
        return eventos;
    }

    public void setEventos(Set<Evento> eventos) {
        this.eventos = eventos;
    }

    public Map<String, Usuario> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(Map<String, Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public Set<TransaccionVentas> getTransaccionesVentas() {
        return transaccionesVentas;
    }

    public void setTransaccionesVentas(Set<TransaccionVentas> transaccionesVentas) {
        this.transaccionesVentas = transaccionesVentas;
    }
    
    
    
    
    
    
    
    
    
    
    /*Metodos Usuario*/
    
    public void agregarUsuario(String unUserName,String unPassword,String unNivel)throws UsuarioException, NoSuchAlgorithmException{
        if(this.usuarios.containsKey(unUserName)){
            if(!this.usuarios.get(unUserName).isEstado()){
                this.usuarios.get(unUserName).activar();
            }else{
                throw new UsuarioException("Usuario Existente. Verifique");
            }
        }else{
            this.usuarios.put(unUserName, new Usuario(unUserName,unPassword,unNivel));
        }
        Complejo.persistencia.update(this);
    }
    
    public void quitarUsuario(String unUserName){
        if(this.usuarios.containsKey(unUserName)){
            this.usuarios.get(unUserName).desactivar();
        }
    }
    
    public Usuario validarUsuario(String unUserName,String unPassword) throws UsuarioException, NoSuchAlgorithmException{      
        
        //Busco el usuario
        Usuario unUsuario=null;
        
        if(this.getUsuarios().containsKey(unUserName)){
            unUsuario = this.getUsuarios().get(unUserName);
            if(!unUsuario.validarPass(unPassword)){
                unUsuario=null; 
            }
        }else{
            throw new UsuarioException("Usuario Inexistente",1);
        }
        return unUsuario;
    }
    
    /* Fin Metodos Usuario */
    
    public Set<Evento> obtenerEventos(){
        //Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
       // Session sess = HibernateUtil.
        Set<Evento> varEventos = new HashSet();
        
        for (Evento unEvento : this.getEventos()) {
            if (unEvento.isActivo()){
                varEventos.add(unEvento);
            }
        }
        
        return varEventos;

    }
    
    public Map<String,Butaca> obtenerButacas(Sala unaSala,Funcion unaFuncion){        
        
        return unaSala.obtenerButacas(unaFuncion);
    }
    
    
    public boolean existeSala(String unNombreSala){
        boolean resultado = false;
        Iterator it = this.getSalas().iterator();
        while(!resultado && it.hasNext()){
            Sala unaSala = (Sala) it.next();
            if(unaSala.getNombre().equals(unNombreSala)){
                resultado = true;
            }
        }
        
        
        return resultado;
    }
    
    public void agregarSala(String unNombre, Integer capacidad) throws SalaException{
        if(this.existeSala(unNombre)){
            throw new SalaException("Sala Existente. Verifique");
        }else{
            this.salas.add(new Sala(unNombre,capacidad));
            Complejo.persistencia.update(this);
        }
        
    }
    
    public void guardarSala(String unNombre) throws SalaException{
        Iterator it = this.getSalas().iterator();
        boolean bandera = true;
        if(this.existeSala(unNombre)){
                //    Iterator it = this.getSalas().iterator();
            while(bandera && it.hasNext()){
                Sala unaSala = (Sala) it.next();
                if(unaSala.getNombre().equals(unNombre)){
                    unaSala.actualizar(unNombre);
                    bandera = false;
                }
            }
        }
        
    }
    
    public void quitarSala(Sala unaSala){
       // unaSala.quitarSecciones();
        unaSala.deshabilitar();
    }
    
    
    
    
    public void agregarSeccionSala(Sala unaSala,String unCodigo){
        unaSala.agregarSeccion(unCodigo);
        
    }
    
    public Set<Sala> obtenerSalas(){
        Set<Sala> unResultSet = new HashSet();
        Iterator it = this.salas.iterator();
        Sala unaSala;
        while(it.hasNext()){
            unaSala = (Sala) it.next();
            if(unaSala.isEstado()){
                unResultSet.add(unaSala);
            }
        }
        return unResultSet;
    }
    
    
    
    
    
    

}
